<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>单例模式改造</title>
</head>

<body>

</body>
<script>
  /*
    单例模式改造
        我需要把 instance 变量保存下来
        singleTon 是一个函数，里面可以判断，可以返回
        以闭包的形式来执行一段代码
        为了保存构造函数，把他也写进闭包函数里面
        如果你觉得需要使用 new ，那么你就直接写
  */


  const Person = (function () {
    // 真是构造函数体
    function Person(name,age,gender) {
      this.name = name;
      this.age = age;
      this.gender = gender;
    }

    Person.prototype.sayHi = function(){console.log('Hi')}

    // 这个变量因为在一个不会被销毁的函数执行空间里面
    // 所以会一直存在
    let instance = null;
    // 全局变量接收的是这个函数
    return function singleTon(...arg) {
      if (!instance) instance = new Person(...arg);
      return instance
    }
  })()

  const p1 = new Person('Jack',18,'男');
  const p2 = new Person('rose',20,'女');

  console.log(p1, p2);
  console.log(p1 === p2);
</script>

</html>